<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>

    <style>
        
    </style>
</head>

<script>
    
    /* 
        所谓的Promise异常穿透是指:
            在Promise中可以不用在每一个then()中指定失败的回调(onRejected), 而是可以在最后统一由catch()处理
    */

    /* 
        Promise异常穿透异常穿透的原理:
            如果没有为then()方法指定onRejected回调时,
            默认自动指定以下回调:
            reason => {throw reason} 或 reason => Promise.reject(reason)
    */
    new Promise((resolve, reject)=>{
        console.log('执行任务1(同步)')
        resolve(1)
    })
    .then(
        value => {
            console.log(`接收到任务1(同步)的结果: ${value}`)    // 接收到任务1(同步)的结果 1
            return Promise.reject(2)
        }
    )
    .then(
        value => console.log(`接收到任务2(同步)的结果: ${value}`)
    )
    .catch(
        reason => console.log(`onRejected-catch: ${reason}`)    // onRejected-catch: 2
    )

    /* 
        执行任务1(同步)
        接收到任务1(同步)的结果: 1
        onRejected-catch: 2
    */



    // ====================================================  分割线  =========================================



    new Promise((resolve, reject)=>{
        console.log('执行任务1(同步)')
        resolve(1)
    })
    .then(
        value => {
            console.log(`接收到任务1(同步)的结果: ${value}`)    // 接收到任务1(同步)的结果 1
            return Promise.reject(2)
        }
    )
    .then(
        value => console.log(`接收到任务2(同步)的结果: ${value}`),
        // 如果then()中已经指定了失败的回调(onRejected),那错误自然会在这被处理(在穿透到catch前被处理)
        reason => console.log(`我将捕获错误 ${reason}`)
    )
    .catch(
        reason => console.log(`onRejected-catch: ${reason}`)
    )


    /* 
        执行任务1(同步)
        接收到任务1(同步)的结果: 1
        我将捕获错误 2
    */


</script>

<body>
    
</body>

</html>